package stack

/**
*1. 基于数据实现栈
 2. 用一个数据记录插入时候当前最小的值。 当push的值<= 当前的最小值， min写入当前值
 3. 弹出的时候， 若弹出的值，==等前值， 也要min的栈中删除栈顶元素。
*/
type MinStack struct {
	val []int
	min []int
}

/** initialize your data structure here. */
func Constructor() MinStack {
	return MinStack{
		val: []int{},
		min: []int{},
	}
}

func (this *MinStack) Push(val int) {
	this.val = append(this.val, val)
	if len(this.min) == 0 || val <= this.GetMin() {
		this.min = append(this.min, val)
	}
}

func (this *MinStack) Pop() {
	if this.val[len(this.val)-1] == this.min[len(this.min)-1] {
		this.min = this.min[:len(this.min)-1]
	}
	this.val = this.val[:len(this.val)-1]
}

func (this *MinStack) Top() int {
	return this.val[len(this.val)-1]
}

func (this *MinStack) GetMin() int {
	return this.min[len(this.min)-1]
}
